<?php

class File {

    /**
     * 如果目录不存在，则创建（迭代创建）
     *
     * @param string $dir 需要创建的目录名称
     * @return void 
     */
    public static function mkdir(string $dir) {
        if (!is_dir($dir)) {
            mkdir($dir, 0777, true);
        }
    }

    /**
     * 获取以时间戳和随机字符串命名的新文件名称
     *
     * @return string
     */
    public static function getNewFilename() {
        return time13() . Gen::mixed(4);
    }

    /**
     * 获取以日期命名的目录名称
     *
     * @return string
     */
    public static function getDateDirname() {
        return date('Y-m-d', time());
    }

    /**
     * 如果目录名最后没有'/'，则添加
     *
     * @param string $dir
     * @return void
     */
    public static function addSlash(string $dir) {
        return $dir . (substr($dir, strlen($dir) - 1, 1) != '/' ? '/' : '');
    }

    /**
     * 获取该文件的目录字符串
     *
     * @param string $path 需要获取目录字符串的文件地址
     * @return string 
     */
    public static function getDir(string $path) {
        return EString::replace(pathinfo($path)['dirname'], '\\', '/');
    }

    /**
     * 获取该文件的文件名（包含扩展名）
     *
     * @param string $path 需要获取文件名称的文件地址
     * @return string 
     */
    public static function getFilename(string $path) {
        return pathinfo($path)['basename'];
    }

    /**
     * 获取该文件的扩展名
     *
     * @param string $path 需要获取文件扩展名的文件地址
     * @return string 
     */
    public static function getExt(string $path) {
        return pathinfo($path)['extension'];
    }

    /**
     * 读取文件，并返回数组（每一行为数组的一个元素）
     *
     * @param string $path 需要读取的文件地址
     * @return array 
     */
    public static function readArray(string $path) {
        
        // 判断文件是否存在
        if (!is_file($path)) {
            throw new Exception('需要读取的文件不存在！');
        }

        // 读取
        $data = [];
        $file = fopen($path, 'r');
        while (!feof($file)) {
            $data[] = fgets($file);
        }
        fclose($file);

        // 返回数据
        return $data;
    }

    /**
     * 读取一个文件的内容
     *
     * @param string $path 需要读取的文件地址
     * @return string
     */
    public static function read(string $path) {
        // 判断文件是否存在
        if (!is_file($path)) {
            throw new Exception('需要读取的文件不存在！');
        }

        // 读取
        $content = file_get_contents($path);

        // 返回数据
        return $content;
    }

    /**
     * 将文本内容写入文件
     *
     * @param string $path 需要写入文件的路径
     * @param string $content 需要写入的内容
     * @return void
     *
     * 注意：
     * 以方法会清空以前的文件内容
     */
    public static function write(string $path, string $content) {
        self::_write($path, $content, false);
    }

    /**
     * 将文本内容追加到文件
     *
     * @param string $path 需要写入文件的路径
     * @param string $content 需要写入的内容
     * @return void
     *
     * 注意：
     * 以方法会在以前文件内容的基础上进行追加写入
     */
    public static function append(string $path, string $content) {
        self::_write($path, $content, true);
    }

    /**
     * _write
     */
    private static function _write(string $path, string $content, bool $append) {

        // 定义mode（写入模式）
        $mode = $append ? 'a' : 'w';

        // 写入文件
        $file = fopen($path, $mode);
        fwrite($file, $content);
        fclose($file);
    }
}
